using System;

namespace SeaVM
{
    public class String
    {
        public string value;
    
        public static Data Add(String a,Number b)
        {
            return new Data(a.value + b.value);
        }
        
        public static Data Add(String a,String b)
        {
            return new Data(a.value + b.value);
        }

        public static Data Add(String a,Boolean b)
        {
            return new Data(a.value + b.value);
        }

        public static Data Add(String a,Nil b)
        {
            return new Data(a.value + "Nil");
        }

        public static Data Sub(String a,Number b)
        {
            throw new VmTypeError("String类型不能和Number类型进行Sub运算");
        }

        public static Data Sub(String a,String b)
        {
            throw new VmTypeError("String类型不能和String类型进行Sub运算");
        }
        
        public static Data Sub(String a,Boolean b)
        {
            throw new VmTypeError("String类型不能和Boolean类型进行Sub运算");
        }

        public static Data Sub(String a,Nil b)
        {
            throw new VmTypeError("String类型不能和Nil类型进行Sub运算");
        }

        public static Data Mul(String a,Number b)
        {
            throw new VmTypeError("String类型不能和Number类型进行Mul运算");
        }

        public static Data Mul(String a,String b)
        {
            throw new VmTypeError("String类型不能和String类型进行Mul运算");
        }

        public static Data Mul(String a,Boolean b)
        {
            throw new VmTypeError("String类型不能和Boolean类型进行Mul运算");
        }

        public static Data Mul(String a,Nil b)
        {
            throw new VmTypeError("String类型不能和Nil类型进行Mul运算");
        }

        public static Data Div(String a,Number b)
        {
            throw new VmTypeError("String类型不能和Number类型进行Div运算");
        }

        public static Data Div(String a,String b)
        {
            throw new VmTypeError("String类型不能和String类型进行Div运算");
        }

        public static Data Div(String a,Boolean b)
        {
            throw new VmTypeError("String类型不能和Boolean类型进行Div运算");
        }

        public static Data Div(String a,Nil b)
        {
            throw new VmTypeError("String类型不能和Nil类型进行Div运算");
        }

        public static Data Mod(String a,Number b)
        {
            throw new VmTypeError("String类型不能和Number类型进行Mod运算");
        }

        public static Data Mod(String a,String b)
        {
            throw new VmTypeError("String类型不能和String类型进行Mod运算");
        }

        public static Data Mod(String a,Boolean b)
        {
            throw new VmTypeError("String类型不能和Boolean类型进行Mod运算");
        }

        public static Data Mod(String a,Nil b)
        {
            throw new VmTypeError("String类型不能和Nil类型进行Mod运算");
        }

        public static Data Gr(String a,Number b)
        {
            throw new VmTypeError("String类型不能和Number类型进行Gr运算");
        }

        public static Data Gr(String a,String b)
        {
            throw new VmTypeError("String类型不能和String类型进行Gr运算");
        }

        public static Data Gr(String a,Boolean b)
        {
            throw new VmTypeError("String类型不能和Boolean类型进行Gr运算");
        }

        public static Data Gr(String a,Nil b)
        {
            throw new VmTypeError("String类型不能和Nil类型进行Gr运算");
        }

        public static Data Le(String a,Number b)
        {
            throw new VmTypeError("String类型不能和Number类型进行Le运算");
        }

        public static Data Le(String a,String b)
        {
            throw new VmTypeError("String类型不能和String类型进行Le运算");
        }

        public static Data Le(String a,Boolean b)
        {
            throw new VmTypeError("String类型不能和Boolean类型进行Le运算");
        }

        public static Data Le(String a,Nil b)
        {
            throw new VmTypeError("String类型不能和Nil类型进行Le运算");
        }

        public static Data Eq(String a,Number b)
        {
            throw new VmTypeError("String类型不能和Number类型进行Eq运算");
        }

        public static Data Eq(String a,String b)
        {
            return new Data(a.value == b.value);
        }

        public static Data Eq(String a,Boolean b)
        {
            throw new VmTypeError("String类型不能和Boolean类型进行Eq运算");
        }

        public static Data Eq(String a,Nil b)
        {
            return new Data(false);
        }

        public static Data Neq(String a,Number b)
        {
            throw new VmTypeError("String类型不能和Number类型进行Neq运算");
        }

        public static Data Neq(String a,String b)
        {
            return new Data(a.value != b.value);
        }

        public static Data Neq(String a,Boolean b)
        {
            throw new VmTypeError("String类型不能和Boolean类型进行Neq运算");
        }

        public static Data Neq(String a,Nil b)
        {
            return new Data(true);
        }
    }
}